#pragma once
#include <cmath>
#include <cstdint>
#include <string>




// ===============================================题目基本信息==================================================
#pragma db object
class Problem{
public:
    Problem(){}
    Problem(const std::uint64_t& problem_id,const std::string& title,const std::uint32_t& difficulty,
                const float& acceptance_rate,const std::string& description,const std::string& case_hint):
                problem_id(problem_id),title(title),difficulty(difficulty)
                ,acceptance_rate(acceptance_rate),description(description),case_hint(case_hint){}

// 题目id
#pragma db id auto
    std::uint64_t problem_id;

// 题目名称
#pragma db type("VARCHAR(255)")
    std::string title;

// 难度
#pragma db type("INT")
    uint32_t difficulty;

// 通过率
#pragma db type("FLOAT")
    float acceptance_rate;

// 描述
#pragma db type("TEXT")
    std::string description;

// 测试用例范围提示
#pragma db type("VARCHAR(255)")
    std::string case_hint;
};

// ===================================================题目的标签列表==================================================
// 这个字段不能和其它字段一起存入一个表，因为后续可能会对某个标签来筛选题目
#pragma db object
class ProblemTags{
public:
    ProblemTags(){}
    ProblemTags(const int32_t& problem_id,const std::string& tag):
                problem_id(problem_id),tag(tag){}

#pragma db id auto
    std::uint64_t id;

// 题目的id 
#pragma db index 
    int32_t problem_id;

// 题目的标签
#pragma db type("VARCHAR(255)")
    std::string tag;
};

// ====================================================测试用例===============================================
#pragma db object
class ProblemCases{
public:
    ProblemCases(){}
    ProblemCases(const int32_t& problem_id,const std::string& input
                ,const std::string& output,const std::string& explanation):
                problem_id(problem_id),input(input),output(output),explanation(explanation){}

#pragma db id auto
    std::uint64_t id;

// 题目的id 
#pragma db index 
    int32_t problem_id;

// 用例的输入
#pragma db type("VARCHAR(255)")
    std::string input;

// 用例的输出
#pragma db type("VARCHAR(255)")
    std::string output;

// 用例的解释说明
#pragma db type("TEXT")
    std::string explanation;

// 测试用例id,之后用来标定某个用例是否通过 todo
// #pragma db type("INT")
//     std::uint32_t case_id;

// 示例样例，展示在题面中 to do...
// #pragma db type("BOOLEAN")
//     std::string is_sample;

// 隐藏样例，用于评测
// #pragma db type("BOOLEAN")
//     std::string is_hidden;

// 用例的时间限制 todo ...
// #pragma db type("VARCHAR(255)")
//     std::string time_limit;
// 用例的内存限制 todo
// #pragma db type("VARCHAR(255)")
//     std::string memory_limit;
// 用例的创建时间 todo
// #pragma db type("VARCHAR(255)")
//     std::string create_time;
// 用例的修改时间 todo
// #pragma db type("VARCHAR(255)")
//     std::string update_time;
};

// =================================================用户题目完成状态===============================================
#pragma db object
class ProblemCompleteStats{
public:
    ProblemCompleteStats(){}
    ProblemCompleteStats(const int32_t& user_id,const int32_t& problem_id
                ,const bool solved):
                user_id(user_id),problem_id(problem_id),solved(solved){}

#pragma db id auto
    std::uint64_t id;

#pragma db index 
    int32_t user_id;

// 题目的id 
#pragma db type("INT")
    int32_t problem_id;

// 题目完成状态
#pragma db type("BOOL")
    bool solved;
};


// =================================================用户提交记录表===============================================
#pragma db object
class ProblemSubmissionRecord{
public:
    ProblemSubmissionRecord(){}
    ProblemSubmissionRecord(std::string user_id,
                            std::uint32_t problem_id,
                            std::string accept,
                            std::string language,
                            std::string time)
        : user_id(user_id),
          problem_id(problem_id),
          accept(accept),
          language(std::move(language)),
          time(std::move(time)) {}
#pragma db id auto
    std::uint32_t id;

// 用户id 
#pragma db index type("VARCHAR(255)")
    std::string user_id;

// 题目的id 
#pragma db index type("INT")
    int32_t problem_id;

// 提交记录的id 
#pragma db index type("VARCHAR(255)")
    std::string submit_id;

// 是否通过(accept、wrong anwser runtime error、compile error...)
#pragma db type("VARCHAR(32)")
    std::string accept;

#pragma db type("TEXT")
    std::string result;

// 提交代码使用的语言
#pragma db type("VARCHAR(32)")
    std::string language;

// 提交时的时间“2025-01-01 12:22”即可
#pragma db type("VARCHAR(64)")
    std::string time;

// code
#pragma db type("TEXT")
    std::string code;
};
